#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>

/* 定义 ioctl 命令 */
#define CLOSE_CMD     _IO(0XEF, 0x1)     /* 关闭定时器 */
#define OPEN_CMD      _IO(0XEF, 0x2)     /* 打开定时器 */
#define SETPERIOD_CMD _IO(0XEF, 0x3)     /* 设置定时器周期命令 */

int main(int argc, char *argv[])
{
    int fd;
    int cmd;
    int period;
    int ret;
    char str[100];  // 用于清空输入缓冲区
    char *filename;

    if(argc != 2) {
        printf("Error Usage!\r\n");
        printf("Usage: %s /dev/timer_device_name\n", argv[0]);
        return -1;
    }

    filename = argv[1];
    
    /* 打开设备 */
    fd = open(filename, O_RDWR);
    if(fd < 0) {
        printf("Can't open file %s\r\n", filename);
        return -1;
    }

    while(1) {
        printf("\r\n======= timer test =======\r\n");
        printf("输入命令:\r\n");
        printf("1 - 关闭定时器\r\n");
        printf("2 - 打开定时器\r\n");
        printf("3 - 设置定时器周期\r\n");
        printf("4 - 退出程序\r\n");
        printf("请输入: ");
        
        ret = scanf("%d", &cmd);
        if (ret != 1) { /* 参数输入错误 */
            fgets(str, sizeof(str), stdin); /* 防止卡死 */
            printf("输入错误! 请输入数字。\r\n");
            continue;
        }

        switch(cmd) {
            case 1:
                /* 关闭定时器 */
                ioctl(fd, CLOSE_CMD, 0);
                printf("定时器已关闭!\r\n");
                break;
                
            case 2:
                /* 打开定时器 */
                ioctl(fd, OPEN_CMD, 0);
                printf("定时器已打开!\r\n");
                break;
                
            case 3:
                /* 设置定时器周期 */
                printf("请输入定时器周期(单位: ms): ");
                ret = scanf("%d", &period);
                if (ret != 1) { /* 参数输入错误 */
                    fgets(str, sizeof(str), stdin); /* 防止卡死 */
                    printf("输入错误! 请输入有效的数字。\r\n");
                    break;
                }
                ioctl(fd, SETPERIOD_CMD, period);
                printf("定时器周期已设置为 %d ms!\r\n", period);
                break;
                
            case 4:
                /* 退出程序 */
                close(fd);
                exit(0);
                break;
                
            default:
                printf("无效命令! 请输入 1~4 之间的数字\r\n");
                break;
        }
    }

    close(fd);
    return 0;
}